#include "StringOp.h"
#include <stdarg.h>


int read_csv_vector(std::vector < std::vector <std::string>  >  &vals, const char *sz)
{
	vals.clear();
	if (sz == NULL)
		return 0;

	std::string s_value;
	int bcnt = 0;

	for (; *sz; sz++)
	{
		switch (*sz)
		{
		case '(':
			bcnt = 1;
			s_value.clear();
			break;
		case ')':
			if (bcnt--)
			{
				vals.resize(vals.size() + 1);

				const char *vsz = s_value.c_str();
				while (*vsz)
				{
					const char *vszb = vsz;
					for (;  *vsz; vsz++)
						if (*vsz == '|')
							break;
					vals.back().push_back(std::string(vszb, vsz - vszb));
					if (*vsz)
						vsz ++;
				}
			}
			break;
		default:
			if (bcnt > 0)
				s_value +=  *sz;
		}
	}
	return vals.size();
}

int read_csv_vector_float(std::vector < std::vector <float>  >  &vals, int size, const char *sz)
{
	vals.clear();
	if (sz == NULL)
		return 0;

	std::string s_value;
	int bcnt = 0;

	for (;  *sz; sz++)
	{
		switch (*sz)
		{
		case '(':
			bcnt = 1;
			s_value.clear();
			break;
		case ')':
			if (bcnt--)
			{
				int j;
				vals.resize(vals.size() + 1);
				vals.back().resize(size);

				float *fv = &vals.back()[0];
				const char *vsz = s_value.c_str();
				for (j = 0; j < size &&  *vsz; j++)
				{
					if (sscanf(vsz, "%f", fv + j) != 1)
						break;
					for (;  *vsz; vsz++)
						if (*vsz == '|')
						{
							vsz++;
							break;
						}
				}
				if (j != size)
					vals.pop_back();
			}
			break;
		default:
			if (bcnt > 0)
				s_value +=  *sz;
		}
	}
	return vals.size();
}

int int_2_string( const void* p_obj, std::string& str )
{
	char buf[64];
	sprintf(buf, "%d", *(int*)p_obj);
	str = buf;
	return str.size();
}

int float_2_string( const void* p_obj, std::string& str )
{
	char buf[64];
	sprintf(buf, "%f", *(float*)p_obj);
	str = buf;
	return str.size();
}

int string_2_string( const void* p_obj, std::string& str )
{
	str = *(std::string*)p_obj;
	return str.size();
}


int vsscanf(const char* psz_start, const char* psz_end, const char* fmt, int va_len, va_list p_va)
{
	if (psz_start >= psz_end)
		return 0;

	int n = -1;
	void* p[10] = {0};
	for (int i = 0; i < va_len; ++ i)
		p[i] = va_arg(p_va, void*);
	int ret = sscanf(psz_start, fmt, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]);
	return ret;
}

const char* parse_scanf(const char* psz_data, const char* fmt, int va_len, ...)
{
	va_list params;
	va_start(params, va_len);
	for (const char* psz_start = psz_data, *psz_end = psz_data; true; ++ psz_end)
	{
		if (*psz_end == ' ' || *psz_end == '\0')
		{
			if (vsscanf(psz_start, psz_end, fmt, va_len, params))
			{
				va_end(params);
				return (*psz_end == '\0') ? psz_end : psz_end+1;
			}
			if (*psz_start == '\0')
				break;
		}
	}
	va_end(params);
	return NULL;
}